package com.fdb.efp.nls.api.rest;

import com.fdb.basic.framework.core.constant.ApplicationConstance;
import com.fdb.basic.framework.core.constant.ResponseData;
import com.fdb.basic.framework.core.util.TimeUtil;
import com.fdb.basic.framework.web.controller.AbstractController;
import com.fdb.basic.sequence.service.facade.SequenceService;
import com.fdb.efp.nls.api.service.RiskmUtilService;
import com.fdb.efp.nls.common.RiskColltConstant;
import com.fdb.efp.nls.service.facade.ColltResRecordService;
import com.fdb.efp.nls.service.facade.ColltTaskCommonService;
import com.fdb.efp.nls.service.facade.ColltTaskInfoService;
import com.fdb.efp.nls.service.facade.ColltTaskRcdService;
import com.fdb.efp.nls.service.vo.ColltResRecordVO;
import com.fdb.efp.nls.service.vo.ColltTaskInfoVO;
import com.fdb.efp.nls.service.vo.ColltTaskRcdVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;


/**
 * Controller：催收任务记录表
 * @author ligm
 * @date 2019-08-27
 */
@RestController
@RequestMapping("/api")
public class ColltTaskRcdController extends AbstractController {

	@Autowired
	@Qualifier("colltTaskRcdService")
	private ColltTaskRcdService colltTaskRcdService;

	@Autowired
	@Qualifier("dbSeqService")
	private SequenceService sequenceService;

	@Autowired
	@Qualifier("colltTaskInfoService")
	private ColltTaskInfoService colltTaskInfoService;

	@Autowired
	@Qualifier("colltResRecordService")
	private ColltResRecordService colltResRecordService;

	@Autowired
	private ColltTaskCommonService colltTaskCommonService;

	@Autowired
	private RiskmUtilService riskmUtilService;

	/**
	 * 新增数据
	 *    目前用于外催结案（委外催收、诉讼催收、风险代理）
	 * @param inColltTaskRcdVo
	 * @return
	 */
	@PostMapping(value="/collt/task/rcd")
	public @ResponseBody
    ResponseData<Integer> insertColltTaskRcd(@RequestBody ColltTaskRcdVO inColltTaskRcdVo) {
		int outputVo = 0;
		setUserInfoToVO(inColltTaskRcdVo);
		try {
			//获取催收结果信息，得到还款金额，TODO 催收时间与还款日期，催收结果可以是多笔，但是结案只是一笔 ??
			List<ColltResRecordVO> colltResRecordList = getColltResRecordList(inColltTaskRcdVo);
			//外催导入催收结果可多次导入
			BigDecimal allRepayLmt = colltResRecordList.stream()
					.map(ColltResRecordVO::getRepayLmt)
					.filter(Objects::nonNull)
					.reduce(BigDecimal.ZERO, BigDecimal::add);
			inColltTaskRcdVo.setColltSerno(sequenceService.getSequence("COLLT_TASK_RCD_NO", null, null));
			//inColltTaskRcdVo.setColltTime(colltResRecordList.get(0).getCreateTime());
			inColltTaskRcdVo.setRepayLmt(allRepayLmt);
			//inColltTaskRcdVo.setRepayDate(colltResRecordList.get(0).getRepayDate());
			outputVo = colltTaskRcdService.insertColltTaskRcd(inColltTaskRcdVo);

			if(outputVo == 1){
				//更新催收任务状态为"已结案"
				ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
				colltTaskInfoVO.setColltTaskNo(inColltTaskRcdVo.getColltTaskNo());
				colltTaskInfoVO.setTaskSts(RiskColltConstant.COLLT_OUTS_TASK_STS_04);
				colltTaskInfoVO.setLastUpdateUser(inColltTaskRcdVo.getLoginUserId());
				outputVo = colltTaskInfoService.updateByPk(colltTaskInfoVO);
			}else{
				throw new Exception("插入催收任务记录信息失败！");
			}
		} catch (Exception e) {
			e.printStackTrace();
			outputVo = -1;
			return ResponseData.create(outputVo, ApplicationConstance.FAILURE, e.getMessage(), false);
		}
		return getResponseData(outputVo);
	}



	/**
	 * 根据主键删除信息
	 * @param inColltTaskRcdVo
	 * @return
	 */
	@DeleteMapping(value="/collt/task/rcd")
	public @ResponseBody
    ResponseData<Integer> deleteByPk(@RequestBody ColltTaskRcdVO inColltTaskRcdVo) {
		int outputVo = colltTaskRcdService.deleteByPk(inColltTaskRcdVo);
		return getResponseData(outputVo);
	}

	/**
	 * 根据主键更新信息
	 * @param inColltTaskRcdVo
	 * @return
	 */
	@PutMapping(value="/collt/task/rcd")
	public @ResponseBody
    ResponseData<Integer> updateByPk(@RequestBody ColltTaskRcdVO inColltTaskRcdVo) {
		int outputVo = colltTaskRcdService.updateByPk(inColltTaskRcdVo);
		return getResponseData(outputVo);
	}

	/**
	 * 根据主键查询详情
	 * @return
	 */
	@GetMapping(value="/collt/task/rcd")
	public @ResponseBody
    ResponseData<ColltTaskRcdVO> queryByPk() {
		ColltTaskRcdVO inVo = new ColltTaskRcdVO();
		ColltTaskRcdVO outputVo = colltTaskRcdService.queryByPk(inVo);
		return getResponseData(outputVo);
	}

	/**
	 * 列表数据查询
	 * @param vo
	 * @return
	 */
	@RequestMapping(value="/collt/task/rcds", method= RequestMethod.POST)
	public @ResponseBody
    ResponseData<List<ColltTaskRcdVO>> queryColltTaskRcdAll(@RequestBody ColltTaskRcdVO vo) {
		return null;
	}

	/**
	 * 按催收任务编号查询催收历史记录
	 * @author xiezw
	 * @params  * @param null
	 * @return
	 * @date 2019/9/3 17:33
	 * @version 0.1
	 */
	@RequestMapping(value="/collt/task/rcds/taskno", method= RequestMethod.POST)
	public @ResponseBody
    ResponseData<List<ColltTaskRcdVO>> queryColltTaskRcd(@RequestBody ColltTaskRcdVO vo) {
		List<ColltTaskRcdVO> outputVo = colltTaskRcdService.queryAllByColltTaskNo(vo);
		riskmUtilService.displayUserName(outputVo,"inputUserCode","inputUserName");
		return getResponseData(outputVo);
	}

	/**
	 * 登记任务到催收任务记录表，根据催收任务编号更新任务状态、催收余额
	 * @author xiezw
	 * @params  * @param null
	 * @return
	 * @date 2019/9/2 15:17
	 * @version 0.1
	 */
	@PostMapping(value="/collt/task/rcd/alw")
	public @ResponseBody
    ResponseData<Integer> insertTaskRcd(@RequestBody ColltTaskRcdVO inColltTaskRcdVo) {
		int outputVo = 0;
		setUserInfoToVO(inColltTaskRcdVo);
		try {
			//获取拖欠本金
			String colltTaskNo = inColltTaskRcdVo.getColltTaskNo();
			BigDecimal unpdPrinBal = colltTaskCommonService.getUnpdPrinBalByColltTaskNo(colltTaskNo);

			/** 将任务登记信息保存到催收任务记录表 */
			String colltSeq = sequenceService.getSequence("COLLT_TASK_RCD_NO", "null", "null");
			inColltTaskRcdVo.setColltSerno(colltSeq);
			// 催收时间 = 当前时间
			inColltTaskRcdVo.setColltTime(TimeUtil.getCurrentDateTime());
			inColltTaskRcdVo.setInputDate(TimeUtil.getCurrentDate());
			// 登记员 = 当前登录人
			inColltTaskRcdVo.setInputUserCode(inColltTaskRcdVo.getLoginUserId());
			inColltTaskRcdVo.setLastChgUsr(inColltTaskRcdVo.getLoginUserId());
			outputVo = colltTaskRcdService.insertColltTaskRcd(inColltTaskRcdVo);

			if(outputVo == 1){
				ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
				colltTaskInfoVO.setColltTaskNo(colltTaskNo);
				colltTaskInfoVO.setLastUpdateUser(inColltTaskRcdVo.getLoginUserId());
				/** 判断拖欠本金，并更新催收任务信息 */
				if (unpdPrinBal.compareTo(BigDecimal.ZERO) == 1) {
					colltTaskInfoVO.setTaskSts(RiskColltConstant.COLLT_TASK_STATUS_02);
					colltTaskInfoVO.setColltBalance(unpdPrinBal);
				} else {
					// 任务状态 = "06"
					colltTaskInfoVO.setTaskSts(RiskColltConstant.COLLT_TASK_STATUS_06);
					// 更新任务完成时间(结清才赋完成时间)
					colltTaskInfoVO.setTaskFnshTime(TimeUtil.getCurrentDateTime());
					colltTaskInfoVO.setColltBalance(BigDecimal.ZERO);
				}
				if (colltTaskInfoService.updateByPk(colltTaskInfoVO) != 1) {
					logger.error("催收任务登记后，更新催收任务信息失败，催收任务编号为:" +colltTaskNo);
				}
			}

		} catch (Exception e) {
			logger.error("********************************************催收任务登记出错，异常信息为：" + e.getMessage());
			outputVo = -1;
			return ResponseData.create(outputVo, ApplicationConstance.FAILURE, e.getMessage(), false);
		}
		return getResponseData(outputVo);
	}

	/**
	 * 获取催收结果记录
	 * @param vo 催收任务记录实体
	 * @return
	 * @throws Exception
	 */
	private List<ColltResRecordVO> getColltResRecordList(ColltTaskRcdVO vo) throws Exception {
		ColltResRecordVO colltResRecordVO = new ColltResRecordVO();
		String colltTaskNo = vo.getColltTaskNo();
		String colltBatchNo = vo.getColltBatchNo();
		String outsOrgCode = vo.getOutsOrgCode();
		colltResRecordVO.setColltTaskNo(colltTaskNo);
		colltResRecordVO.setColltBatchNo(colltBatchNo);
		colltResRecordVO.setOutsOrgCode(outsOrgCode);
		List<ColltResRecordVO> colltResRecordVOList = colltResRecordService.queryOneByCondition(colltResRecordVO);
		if(Objects.isNull(colltResRecordVOList) || colltResRecordVOList.isEmpty()){
			throw new Exception("通过批次号:" + colltBatchNo + "，外催机构编号:" +outsOrgCode + "，催收任务编号:" +colltTaskNo +"，获取催收结果信息为空！");
		}
		return colltResRecordVOList;
	}

}

